import { Injectable } from "@angular/core";
import { SQLiteObject, SQLite } from "@ionic-native/sqlite";
import { Platform } from "ionic-angular/platform/platform";
import { Events } from "ionic-angular";

@Injectable()
export class SqliteHelperProvider {
  //sqlite_native不支持Browser
  //在Browser端使用WebSQL(W3C废弃的规范)
  database: SQLiteObject;
  win_db: any; //h5环境下的数据库
  win: any = window; //Window对象 （浏览器窗口对象）

  constructor(
    private platform: Platform, //用来支持浏览器端的
    private sqlite: SQLite,
    private events: Events
  ) {}

  /**
   * 创建数据库
   */
  createOrOpenDb(): Promise<any> {
    return new Promise<any>((resolve, reject) => {
      if (this.isMobile()) {
        this.sqlite
          .create({ name: 'park_data_1.db', location: 'default' })
          .then((db: SQLiteObject) => {
            this.database=db;
            //创建数据表的SQL语句
            this.createTable().then(res=>resolve(res),err=>reject(err));
          })
          .catch(e=>{
            console.error(e);
            reject(e);
          });
      } else {
        this.win_db=this.win.openDatabase('par_data_1.db','1.0','景区信息表'
        ,40*1024*1024);//60M大小
        //创建数据表的SQL语句
      }
    });
  }

  // createDb() {
  //   if (this.isMobile()) {
  //     this.sqlite
  //       .create({ name: "park_data.db", location: "default" })
  //       .then((db: SQLiteObject) => {
  //         this.database = db;
  //         this.creatTable();
  //         this.events.publish("sqlite db: create");
  //       })
  //       .catch(e => {
  //         console.log(e);
  //       });
  //   } else {
  //     this.win_db = this.win.openDatabase(
  //       "park_data.db",
  //       "1.0",
  //       "景区基本信息表",
  //       60 * 1024 * 1024
  //     );
  //     this.creatTable();
  //     this.events.publish("sqlite db: create");
  //   }
  // }

  /**
   * 创建数据表
   */
 createTable(): Promise<any>{
    let sql:string =
        'CREATE TABLE IF NOT EXISTS park_lite(objectId TEXT,name TEXT,point TEXT)';
        return this.executeSql(sql,[]);
      }

      /**
       * 执行SQL语句
       * @param sql 
       * @param params 
       */
  executeSql(sql:string,params: Array<any>) :Promise<any>{
      if(this.isMobile()){//是手机
        if(this.database){//为真执行本地的sql语句
          return this.execLoaclSql(sql,params);
        }
      }else{
        if(this.win_db){//执行web端的sql调用
          return this.execWebSql(sql,params);

        }

      }
      //以上两个都不是返回一个空的Promise对象
      return new Promise(resolve=>resolve([]));
  }


  //封装一下本地和web端的sql
  /**
   * 执行基于本地SQLite的SQL语句
   * @param sql 
   * @param params 
   */
  private  execLoaclSql(sql:string,params:Array<any>): Promise<any>{
      return this.database.executeSql(sql,params);
    }

    /**
     * 执行基于Web SQL的SQL语句
     * @param sql 
     * @param params 
     */
    private   execWebSql(sql:string,params:Array<any>):Promise<any>{
        return new Promise((resolve,reject)=>{
          this.win_db.transaction(tx=>{
            tx.executeSql(sql,params,(tx,res)=>resolve(res),(tx,err)=>
            reject(err));
          },err=>reject(err)); //出现了错误就转出去
        },);
    }




  // creatTable() {
  //   let sql =
  //     "CREATE TABLE IF NOT EXISTS parks_lite(objectId TEXT,name TEXT,point TEXT)";
  //   this.executeSql(sql, []);
  // }

  // executeSql(sql: string, array: Array<any>): Promise<any> {
  //   return new Promise((resolve, reject) => {
  //     if (this.isMobile()) {
  //       //手机端
  //       if (this.database) {
  //         this.database.executeSql(sql, array).then(
  //           data => {
  //             resolve(data);
  //           },
  //           err => {
  //             reject(err);
  //             console.log("不能执行sql语句：" + err.message);
  //           }
  //         );
  //       } else {
  //         return new Promise(resolve => {
  //           resolve([]);
  //         });
  //       }
  //     } else {
  //       if (this.win_db) {
  //         //初始化成功
  //         return this.execWebSql(sql, array)
  //           .then(data => {
  //             resolve(data);
  //           })
  //           .catch(err => {
  //             console.log("错误：" + err);
  //           });
  //       }
  //     }
  //   });
  // }

  // /**
  //  * 查询H5环境下的数据库
  //  * @param sql
  //  * @param params
  //  */
  // execWebSql(sql: string, params: Array<any>): Promise<any> {
  //   return new Promise((resolve, reject) => {
  //     try {
  //       this.win_db.transaction(
  //         tx => {
  //           tx.executeSql(
  //             sql,
  //             params,
  //             (tx, res) => resolve(res),
  //             (tx, err) => reject(err)
  //           );
  //         },
  //         err => reject(err)
  //       );
  //     } catch (err) {
  //       reject(err);
  //     }
  //   });
  // }

  /**
   * 判断是否为真机环境
   */
  isMobile(): boolean {
    return this.platform.is("mobile") && !this.platform.is("mobileweb");
  }
}
